﻿#pragma once
#ifndef WRWORKAFFAIR_H
#define WRWORKAFFAIR_H

#include "WRWorkObject.h"

//声明工作处理类。
class WRWorkProcess;

//表示工作事务。
class WRSOFT_WORKING_COMMON_CLASS WRWorkAffair
{
public:
    //查询指定标识的工作处理者。
    virtual WRWorkDealer* queryWorkDealer(const QUuid &uuid);
    //查询指定标识的任务处理者。
    virtual WRTaskDealer* queryTaskDealer(const QUuid& uuid);
    //查询指定标识的数据源接口。
    virtual WRDataSource* queryDataSource(const QUuid& uuid);
    //查询指定标识的事件源接口。
    virtual WREventSource* queryEventSource(const QUuid& uuid);
    //查询指示标识的状态源接口。
    virtual WRStateSource* queryStateSource(const QUuid& uuid);

private:
    //引用计数。
    QAtomicInt m_refCnt;
    //工作对象。
    WRWorkObject* m_object;
    //工作事务。
    WRWorkAffair* m_affair;

    Q_DISABLE_COPY(WRWorkAffair)

protected:
    //初始化工作事务。
    explicit WRWorkAffair(WRWorkObject* object);
    //初始化工作事务。
    explicit WRWorkAffair(WRWorkAffair* affair);

    //清理当前对象所占用的相关资源。
    virtual ~WRWorkAffair(void);

public:
    //添加对象引用。
    inline void addRef(void)
    {
        m_refCnt.ref();
    }
    //释放对象引用, 如果引用计数为0，则删除对象，返回True，否则返回False。
    inline bool release(void)
    {
        if (!m_refCnt.deref())
        {
            delete this;
            return true;
        }
        return false;
    }

    //获取一个值，该值标识当前工作事务是否本地工作事务。
    inline bool local(void) const
    {
        return m_object->local();
    }
    //获取包含当前工作事务的工作进程。
    inline WRWorkDaemon* daemon(void) const
    {
        return m_object->daemon();
    }
    //获取包含当前工作事务的工作域，如果是本地事务，则返回0。
    inline WRWorkDomain* domain(void) const
    {
        return m_object->domain();
    }
    //获取包含当前工作事务的会话，如果是本地事务，则返回0。
    inline WRWorkSession* session(void) const
    {
        return m_object->session();
    }
    //获取包含当前工作事务的工作对象。
    inline WRWorkObject* object(void) const
    {
        return m_object;
    }
    //获取包含当前工作事务的工作事务。
    inline WRWorkAffair* affair(void) const
    {
        return m_affair;
    }

    //创建指定对象的工作处理事务包装。
    static WRWorkAffair* create(WRWorkObject* object, WRWorkProcess* process);
    //创建指定事务的工作处理事务包装。
    static WRWorkAffair* create(WRWorkAffair* affair, WRWorkProcess* process);
};

#endif // WRWORKAFFAIR_H
